
#pragma once

#include "../DefinesCore.hpp"
#include <string>

CYBERTRON_BEGIN

class SocketUdpClientImpl;

struct SocketUdpSenderConfig
{
	SocketUdpSenderConfig()
	{
		isBroadcast = false;
	}

	bool isBroadcast;
};

class SocketUdpClient
{
public:
	CybertronCoreAPI SocketUdpClient();
	CybertronCoreAPI virtual ~SocketUdpClient();

	CybertronCoreAPI bool initialize(const SocketUdpSenderConfig& config);
	CybertronCoreAPI void clear();

	CybertronCoreAPI void broadcast(
		int port, 
		const void* pData, 
		size_t len);
	CybertronCoreAPI void send(
		const std::string& ip,
		int port,
		const void* pData,
		size_t len);

private:
	SocketUdpClient(const SocketUdpClient&);
	SocketUdpClient& operator = (const SocketUdpClient&);

private:
	SocketUdpClientImpl* mpImpl;
};

class SocketUdpRawDataClient
{
public:
    CybertronCoreAPI SocketUdpRawDataClient();
    CybertronCoreAPI virtual ~SocketUdpRawDataClient();

    CybertronCoreAPI bool initialize(const SocketUdpSenderConfig& config);
    CybertronCoreAPI void clear();

    CybertronCoreAPI void broadcast(
        int port,
        const void* pData,
        size_t len);
    CybertronCoreAPI void send(
        const std::string& ip,
        int port,
        const void* pData,
        size_t len);

private:
    SocketUdpRawDataClient(const SocketUdpRawDataClient&);
    SocketUdpRawDataClient& operator = (const SocketUdpRawDataClient&);

private:
    SocketUdpClientImpl* mpImpl;
};

CYBERTRON_END
